package objectOriented;

/**
 * Java面向对象三大特性示例：封装、继承、多态
 */
public class PackageDemoChild extends PackageDemo {
    
    // 1. 封装示例
    public static class Person {
        // 私有属性，实现封装
        private String name;
        private int age;
        public String gender;
        
        // 构造方法
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        
        // 通过公共方法访问私有属性
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            if (name != null && !name.trim().isEmpty()) {
                this.name = name;
            }
        }
        
        public int getAge() {
            return age;
        }
        
        public void setAge(int age) {
            if (age >= 0 && age <= 150) {
                this.age = age;
            }
        }
    }
    
    // 2. 继承示例
    public static class Animal {
        protected String name;
        
        public Animal(String name) {
            this.name = name;
        }
        
        public void eat() {
            System.out.println(name + "正在吃东西");
        }
        
        public void sleep() {
            System.out.println(name + "正在睡觉");
        }
    }
    
    public static class Dog extends Animal {
        public Dog(String name) {
            super(name);
        }
        
        public void bark() {
            System.out.println(name + "在汪汪叫");
        }
        
        // 方法重写，体现多态
        @Override
        public void eat() {
            System.out.println(name + "在吃骨头");
        }
    }
    
    // 3. 多态示例
    public static class Shape {
        public void draw() {
            System.out.println("绘制形状");
        }
    }
    
    public static class Circle extends Shape {
        @Override
        public void draw() {
            System.out.println("绘制圆形");
        }
    }
    
    public static class Rectangle extends Shape {
        @Override
        public void draw() {
            System.out.println("绘制矩形");
        }
    }
    
    public void childAccessTest() {
        // 可以访问父类的public成员
        System.out.println(publicField);
        
        // 可以访问父类的protected成员
        System.out.println(protectedField);
        
        // 可以访问父类的default成员（同包）
        System.out.println(defaultField);
        
        // 无法访问父类的private成员
        // System.out.println(privateField); // 编译错误
        
        publicMethod();
        protectedMethod();
        defaultMethod();
        // privateMethod(); // 编译错误
    }

    // 添加主函数来测试
    public static void main(String[] args) {
        // 测试基类功能
        PackageDemo demo = new PackageDemo();
        System.out.println("=== 测试基类 ===");
        demo.testAccess();
        
        // 测试同文件类的访问
        System.out.println("\n=== 测试同文件类访问 ===");
        SameFileClass sameFile = new SameFileClass();
        sameFile.accessTest();
        
        // 测试子类访问
        System.out.println("\n=== 测试子类访问 ===");
        PackageDemoChild child = new PackageDemoChild();
        child.childAccessTest();
    }
} 